import java.io.InputStream;
import java.security.KeyStore;
import java.security.Security;
import java.util.Enumeration;

import javax.net.ssl.KeyManagerFactory;
import javax.net.ssl.SSLContext;
import javax.net.ssl.SSLSocket;
import javax.net.ssl.SSLSocketFactory;
import javax.net.ssl.TrustManagerFactory;

import org.bouncycastle.jce.provider.BouncyCastleProvider; // eah! ac� est�!!


public class Tester {
	private final static String IP_SERVER="127.0.0.1";
	private final static int PORT_SERVER = 8888;
	private final static String KS_PATH= "keystore/cliente.bks";
	
	private final static String PASS="c1";
	private final static String USR="c1@gmail.com"; 
	
	private Boolean cortar;
	
	//private SSLSocket socket_cliente;
	
	public static void main(String[] args){
		new Tester().conectar();
	}
	
	public void conectar(){
		
		
		try {
			Security.addProvider(new BouncyCastleProvider());
			int n=10;
			cortar=new Boolean(true);
			for(int i=1; i<=n; i++){
				cortar=new Boolean(!cortar);
				System.err.println("*CORTAR: "+cortar);
			// se obtiene una instancia de keystore del tipo BKS y luego se lo asocia al keystore del directorio raw
			KeyStore key_store = KeyStore.getInstance("BKS");
			InputStream keystoreStream = getClass().getClassLoader().getResourceAsStream("keystore/cliente"+i+".bks");
			if(keystoreStream==null)
				System.err.println("NO SE ENCONTRO EL BKS!!!");
			else{
				
				// se hace un load del keystore
				key_store.load(keystoreStream, ("c"+i+"").toCharArray());
				
				
				Enumeration<String> cjto=key_store.aliases();
				while(cjto.hasMoreElements()){
					String alias = cjto.nextElement();
					//System.out.println(alias);
					if(!alias.equals("certificado1")){
						System.out.println(alias);
						
						
						// asociamos el keystore a una instancia de keymanager para gestionar las claves p�blica y privadas
				        KeyManagerFactory key_manager = KeyManagerFactory.getInstance("SunX509");
				        key_manager.init(key_store, alias.toCharArray());// no era necesario el usario???
				         
						// para gestionar los certificados del keystore, lo asociamos a un trust-storemanager
				        TrustManagerFactory trust_manager = TrustManagerFactory.getInstance("SunX509");
				        trust_manager.init(key_store);
				         
				        // con una instancia de SSLContext establecemos las opciones del socket que luego generaremos
				        SSLContext ssl_context = SSLContext.getInstance("TLS");
				        
				        // IMPORTANTE: ac� establecemos el keymanager y el truststore local del socket ssl
				        ssl_context.init(key_manager.getKeyManagers(), trust_manager.getTrustManagers(), null);
				        
				        // finalmente obtenemos la instancia del socket ssl cliente que usaremos para conectarnos al servidor
				        SSLSocketFactory ssl_factory = ssl_context.getSocketFactory();
				        
				        // creo una instancia de socket ssl para con conexi�n al servidor
				        final SSLSocket socket_cliente = (SSLSocket) ssl_factory.createSocket(IP_SERVER, PORT_SERVER); 
				        
				        // iniciar handshake al servidor
				        socket_cliente.startHandshake();
				        final String id = "c"+i+"";
				        Runnable runnable = new Runnable(){
				        	private boolean cort=cortar;
				        	
				        	public void run(){
				        		
				        		System.err.println("CORTAR: "+cort);
				        		new ClienteTest(socket_cliente,id).simular(cort);
				        	}
				        };
				        new Thread(runnable).start();
				        
						
					}
				}
				
		        
			}//for
	        }
			}catch (Exception e) {
	    	 e.printStackTrace();
	     }
		
		
	}

}
